提醒:由於看到這系列鐵人訂閱人數漸漸變多,標記一下這些內容是在「非常萌新時期」所寫,更多技術內容請參考我的 Github,歡迎跟我一起討論 ^ ^
接著今天按照教材步驟,藉由昨天學習的方法,建立基礎 template,並完成 Controller 回應 get request 的內容,完成呈現 read-only 的頁面。
extends
+ block
)(/controllers/bookController.js 中的 index)
countDocuments({}, callback)
:Mongoose 的功能,可用來計數,計算 參數1 設定的條件,並由 callback 回傳數量(或error)。async.parallel()
來讓所有資料同時動作。res.render()
,帶入資料到 template 輸出頁面。if
、else
新增「錯誤提示訊息」。find()
找出符合條件的資料 2.以exec()
將資料帶進callback執行 3.callback 中以render()
將資料以變數帶進 template 呈現在頁面中。exports.genre_list = function (req, res, next) {
Genre.find()
.exec(function (err, listGenre) {
if (err) { return next(err) }
res.render('genre_list', { title: 'Genre List', genre_list: listGenre })})}
extends layout
block content
h1= title
ul
- genre_list.sort(function(a, b) {let textA = a.name.toUpperCase(); let textB = b.name.toUpperCase(); return (textA < textB) ? -1 : (textA > textB) ? 1 : 0;});
each genre in genre_list
li
a(href=genre.url) #{genre.name}
else
li There are no genres.
AuthorSchema
.virtual('birthDay')
.get(function () {
if (this.date_of_birth) {
return moment(this.date_of_birth).format('MMMM Do, YYYY')
} else {
return ''
}
})
async.parallel()
同時撈各個來源的資料 2.以findById()
給予配對的資訊 3.以req.params.id
來取得 request 所配對的 id 4.以render()
將資料以變數帶進 template 呈現在頁面中。req.params.id
取得ID。(req.params
可取得路徑參數,路徑上以冒號表示的部分)next(err)
,以 err 為參數帶到 app.js 中的下一個 middleware 執行,使其對 error 進行處理。(原本都只執行到 app.use('/catalog', catalogRouter)
這個 middleware,現在使用 next
使其跳入下一個。)exports.author_detail = function (req, res, next) {
async.parallel({
author: function (callback) {
Author.findById(req.params.id)
.exec(callback)
},
authors_books: function (callback) {
Book.find({ author: req.params.id }, 'title summary')
.exec(callback)
}
}, function (err, results) {
if (err) { return next(err) }
if (results.author === null) {
const err = new Error('Author not found')
err.status = 404
return next(err)
}
res.render('author_detail', { title: 'Author Detail', author: results.author, author_books: results.authors_books })
})
}